package top.codedance.iotp.common.util.db;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public interface DaoUtil<T> {

    /**
     * 获取连接
     */
    Connection getConnection();

    /**
     * 还回连接
     * @param c
     */
    void returnConnection(Connection c);

    /**
     * 释放资源
     */
    void destory();

    /**
     * 创建表
     * @throws SQLException
     */
    void createTable() throws SQLException;

    /**
     * 添加记录
     *
     * @param entity
     * @throws SQLException
     */
    void add(T entity) throws SQLException;

    /**
     * 判断是否存在某个实体
     * @param entity
     * @return
     * @throws SQLException
     */
    boolean has(T entity) throws SQLException;

    /**
     * 判断是否存在某个实体， 使用公钥解密
     * @param entity
     * @param privateKey
     * @return
     * @throws SQLException
     */
    boolean has(T entity, String privateKey) throws SQLException;

    /**
     * 判断是否是管理员
     * @param entity
     * @return
     * @throws SQLException
     */
    boolean hasAdmin(T entity) throws SQLException;

    /**
     * 判断是否是管理员，使用公钥解密
     * @param entity
     * @param privateKey
     * @return
     * @throws SQLException
     */
    boolean hasAdmin(T entity, String privateKey) throws SQLException;

    /**
     * 获取单条记录
     * @param entity
     * @return
     * @throws SQLException
     */
    T getEntity(T entity) throws SQLException;

    /**
     * 获取单条记录，使用公钥解密
     * @param entity
     * @param privateKey
     * @return
     * @throws SQLException
     */
    T getEntity(T entity, String privateKey) throws SQLException;

    /**
     * 查询所有记录
     *
     * @return
     * @throws SQLException
     */
    List<T> selectAll() throws SQLException;

    /**
     * 查询所有记录，使用公钥解密
     *
     * @param privateKey
     * @return
     * @throws SQLException
     */
    List<T> selectAll(String privateKey) throws SQLException;

    /**
     * 更新数据
     *
     * @param entity
     * @throws SQLException
     */
    void update(T entity) throws SQLException;

    /**
     * 删除记录
     *
     * @param id
     * @throws SQLException
     */
    void delete(int id) throws SQLException;
}
